���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!PKE\ t&class-submenu-capability-normalize.phpnuW+A $submenu_page ) { if ( $submenu_page[3] === 'manage_options' ) { $submenu_pages[ $index ][3] = 'wpseo_manage_options'; } } return $submenu_pages; } } PKE\.class-replacevar-editor.phpnuW+A true, 'label_title' => '', 'label_description' => '', 'description_placeholder' => '', 'has_new_badge' => false, 'is_disabled' => false, 'has_premium_badge' => false, ] ); $this->validate_arguments( $arguments ); $this->yform = $yform; $this->arguments = [ 'title' => (string) $arguments['title'], 'description' => (string) $arguments['description'], 'page_type_recommended' => (string) $arguments['page_type_recommended'], 'page_type_specific' => (string) $arguments['page_type_specific'], 'paper_style' => (bool) $arguments['paper_style'], 'label_title' => (string) $arguments['label_title'], 'label_description' => (string) $arguments['label_description'], 'description_placeholder' => (string) $arguments['description_placeholder'], 'has_new_badge' => (bool) $arguments['has_new_badge'], 'is_disabled' => (bool) $arguments['is_disabled'], 'has_premium_badge' => (bool) $arguments['has_premium_badge'], ]; } /** * Renders a div for the react application to mount to, and hidden inputs where * the app should store it's value so they will be properly saved when the form * is submitted. * * @return void */ public function render() { $this->yform->hidden( $this->arguments['title'], $this->arguments['title'] ); $this->yform->hidden( $this->arguments['description'], $this->arguments['description'] ); printf( '
', esc_attr( $this->arguments['title'] ), esc_attr( $this->arguments['description'] ), esc_attr( $this->arguments['page_type_recommended'] ), esc_attr( $this->arguments['page_type_specific'] ), esc_attr( $this->arguments['paper_style'] ), esc_attr( $this->arguments['label_title'] ), esc_attr( $this->arguments['label_description'] ), esc_attr( $this->arguments['description_placeholder'] ), esc_attr( $this->arguments['has_new_badge'] ), esc_attr( $this->arguments['is_disabled'] ), esc_attr( $this->arguments['has_premium_badge'] ) ); } /** * Validates the replacement variable editor arguments. * * @param array $arguments The arguments to validate. * * @return void * * @throws InvalidArgumentException Thrown when not all required arguments are present. */ protected function validate_arguments( array $arguments ) { $required_arguments = [ 'title', 'description', 'page_type_recommended', 'page_type_specific', 'paper_style', ]; foreach ( $required_arguments as $field_name ) { if ( ! array_key_exists( $field_name, $arguments ) ) { throw new InvalidArgumentException( sprintf( /* translators: %1$s expands to the missing field name. */ __( 'Not all required fields are given. Missing field %1$s', 'wordpress-seo' ), $field_name ) ); } } } } PKE\0class-admin-menu.phpnuW+Aget_manage_capability(); $page_identifier = $this->get_page_identifier(); $admin_page_callback = $this->get_admin_page_callback(); // Get all submenu pages. $submenu_pages = $this->get_submenu_pages(); foreach ( $submenu_pages as $submenu_page ) { if ( WPSEO_Capability_Utils::current_user_can( $submenu_page[3] ) ) { $manage_capability = $submenu_page[3]; $page_identifier = $submenu_page[4]; $admin_page_callback = $submenu_page[5]; break; } } foreach ( $submenu_pages as $index => $submenu_page ) { $submenu_pages[ $index ][0] = $page_identifier; } /* * The current user has the capability to control anything. * This means that all submenus and dashboard can be shown. */ global $admin_page_hooks; add_menu_page( 'Yoast SEO: ' . __( 'Dashboard', 'wordpress-seo' ), 'Yoast SEO ' . $this->get_notification_counter(), $manage_capability, $page_identifier, $admin_page_callback, $this->get_icon_svg(), 99 ); // Wipe notification bits from hooks. // phpcs:ignore WordPress.WP.GlobalVariablesOverride -- This is a deliberate action. $admin_page_hooks[ $page_identifier ] = 'seo'; // Add submenu items to the main menu if possible. $this->register_submenu_pages( $submenu_pages ); } /** * Returns the list of registered submenu pages. * * @return array List of registered submenu pages. */ public function get_submenu_pages() { global $wpseo_admin; $search_console_callback = null; // Account for when the available submenu pages are requested from outside the admin. if ( isset( $wpseo_admin ) ) { $google_search_console = new WPSEO_GSC(); $search_console_callback = [ $google_search_console, 'display' ]; } // Submenu pages. $submenu_pages = [ $this->get_submenu_page( __( 'Search Console', 'wordpress-seo' ), 'wpseo_search_console', $search_console_callback ), $this->get_submenu_page( __( 'Tools', 'wordpress-seo' ), 'wpseo_tools' ), ]; /** * Filter: 'wpseo_submenu_pages' - Collects all submenus that need to be shown. * * @param array $submenu_pages List with all submenu pages. */ return (array) apply_filters( 'wpseo_submenu_pages', $submenu_pages ); } /** * Returns the notification count in HTML format. * * @return string The notification count in HTML format. */ protected function get_notification_counter() { $notification_center = Yoast_Notification_Center::get(); $notification_count = $notification_center->get_notification_count(); // Add main page. /* translators: Hidden accessibility text; %s: number of notifications. */ $notifications = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); return sprintf( '%2$s', $notification_count, $notifications ); } /** * Returns the capability that is required to manage all options. * * @return string Capability to check against. */ protected function get_manage_capability() { return 'wpseo_manage_options'; } } PKE\ 0wwclass-replacevar-field.phpnuW+Ayform = $yform; $this->field_id = $field_id; $this->label = $label; $this->page_type_recommended = $page_type_recommended; $this->page_type_specific = $page_type_specific; } /** * Renders a div for the react application to mount to, and hidden inputs where * the app should store it's value so they will be properly saved when the form * is submitted. * * @return void */ public function render() { $this->yform->hidden( $this->field_id, $this->field_id ); printf( '
', esc_attr( $this->field_id ), esc_attr( $this->label ), esc_attr( $this->page_type_recommended ), esc_attr( $this->page_type_specific ) ); } } PKE\+!!class-base-menu.phpnuW+Amenu = $menu; } /** * Returns the list of registered submenu pages. * * @return array List of registered submenu pages. */ abstract public function get_submenu_pages(); /** * Creates a submenu formatted array. * * @param string $page_title Page title to use. * @param string $page_slug Page slug to use. * @param callable|null $callback Optional. Callback which handles the page request. * @param callable[]|null $hook Optional. Hook to trigger when the page is registered. * * @return array Formatted submenu. */ protected function get_submenu_page( $page_title, $page_slug, $callback = null, $hook = null ) { if ( $callback === null ) { $callback = $this->get_admin_page_callback(); } return [ $this->get_page_identifier(), '', $page_title, $this->get_manage_capability(), $page_slug, $callback, $hook, ]; } /** * Registers submenu pages as menu pages. * * This method should only be used if the user does not have the required capabilities * to access the parent menu page. * * @param array $submenu_pages List of submenu pages to register. * * @return void */ protected function register_menu_pages( $submenu_pages ) { if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) { return; } // Loop through submenu pages and add them. array_walk( $submenu_pages, [ $this, 'register_menu_page' ] ); } /** * Registers submenu pages. * * @param array $submenu_pages List of submenu pages to register. * * @return void */ protected function register_submenu_pages( $submenu_pages ) { if ( ! is_array( $submenu_pages ) || empty( $submenu_pages ) ) { return; } // Loop through submenu pages and add them. array_walk( $submenu_pages, [ $this, 'register_submenu_page' ] ); } /** * Registers a submenu page as a menu page. * * This method should only be used if the user does not have the required capabilities * to access the parent menu page. * * @param array $submenu_page { * Submenu page definition. * * @type string $0 Parent menu page slug. * @type string $1 Page title, currently unused. * @type string $2 Title to display in the menu. * @type string $3 Required capability to access the page. * @type string $4 Page slug. * @type callable $5 Callback to run when the page is rendered. * @type array $6 Optional. List of callbacks to run when the page is loaded. * } * * @return void */ protected function register_menu_page( $submenu_page ) { // If the submenu page requires the general manage capability, it must be added as an actual submenu page. if ( $submenu_page[3] === $this->get_manage_capability() ) { return; } $page_title = 'Yoast SEO: ' . $submenu_page[2]; // Register submenu page as menu page. $hook_suffix = add_menu_page( $page_title, $submenu_page[2], $submenu_page[3], $submenu_page[4], $submenu_page[5], $this->get_icon_svg(), 99 ); // If necessary, add hooks for the submenu page. if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) { $this->add_page_hooks( $hook_suffix, $submenu_page[6] ); } } /** * Registers a submenu page. * * This method will override the capability of the page to automatically use the * general manage capability. Use the `register_menu_page()` method if the submenu * page should actually use a different capability. * * @param array $submenu_page { * Submenu page definition. * * @type string $0 Parent menu page slug. * @type string $1 Page title, currently unused. * @type string $2 Title to display in the menu. * @type string $3 Required capability to access the page. * @type string $4 Page slug. * @type callable $5 Callback to run when the page is rendered. * @type array $6 Optional. List of callbacks to run when the page is loaded. * } * * @return void */ protected function register_submenu_page( $submenu_page ) { $page_title = $submenu_page[2]; /* * Handle the Google Search Console special case by passing a fake parent * page slug. This way, the sub-page is stil registered and can be accessed * directly. Its menu item won't be displayed. */ if ( $submenu_page[4] === 'wpseo_search_console' ) { // Set the parent page slug to a non-existing one. $submenu_page[0] = 'wpseo_fake_menu_parent_page_slug'; } $page_title .= ' - Yoast SEO'; // Register submenu page. $hook_suffix = add_submenu_page( $submenu_page[0], $page_title, $submenu_page[2], $submenu_page[3], $submenu_page[4], $submenu_page[5] ); // If necessary, add hooks for the submenu page. if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) ) ) { $this->add_page_hooks( $hook_suffix, $submenu_page[6] ); } } /** * Adds hook callbacks for a given admin page hook suffix. * * @param string $hook_suffix Admin page hook suffix, as returned by `add_menu_page()` * or `add_submenu_page()`. * @param array $callbacks Callbacks to add. * * @return void */ protected function add_page_hooks( $hook_suffix, array $callbacks ) { foreach ( $callbacks as $callback ) { add_action( 'load-' . $hook_suffix, $callback ); } } /** * Gets the main admin page identifier. * * @return string Admin page identifier. */ protected function get_page_identifier() { return $this->menu->get_page_identifier(); } /** * Checks whether the current user has capabilities to manage all options. * * @return bool True if capabilities are sufficient, false otherwise. */ protected function check_manage_capability() { return WPSEO_Capability_Utils::current_user_can( $this->get_manage_capability() ); } /** * Returns the capability that is required to manage all options. * * @return string Capability to check against. */ abstract protected function get_manage_capability(); /** * Returns the page handler callback. * * @return array Callback page handler. */ protected function get_admin_page_callback() { return [ $this->menu, 'load_page' ]; } /** * Returns the page title to use for the licenses page. * * @deprecated 25.5 * @codeCoverageIgnore * * @return string The title for the license page. */ protected function get_license_page_title() { static $title = null; _deprecated_function( __METHOD__, 'Yoast SEO 25.5' ); if ( $title === null ) { $title = __( 'Upgrades', 'wordpress-seo' ); } if ( YoastSEO()->classes->get( Promotion_Manager::class )->is( 'black-friday-2024-promotion' ) && ! YoastSEO()->helpers->product->is_premium() ) { $title = __( 'Upgrades', 'wordpress-seo' ) . '' . __( '30% OFF', 'wordpress-seo' ) . ''; } return $title; } /** * Returns a base64 URL for the svg for use in the menu. * * @param bool $base64 Whether or not to return base64'd output. * * @return string SVG icon. */ public function get_icon_svg( $base64 = true ) { $svg = ''; if ( $base64 ) { //phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- This encoding is intended. return 'data:image/svg+xml;base64,' . base64_encode( $svg ); } return $svg; } } PKE\<class-menu.phpnuW+Aregister_hooks(); if ( WPSEO_Utils::is_plugin_network_active() ) { $network_admin_menu = new WPSEO_Network_Admin_Menu( $this ); $network_admin_menu->register_hooks(); } $capability_normalizer = new WPSEO_Submenu_Capability_Normalize(); $capability_normalizer->register_hooks(); } /** * Returns the main menu page identifier. * * @return string Page identifier to use. */ public function get_page_identifier() { return self::PAGE_IDENTIFIER; } /** * Loads the requested admin settings page. * * @return void */ public function load_page() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. if ( isset( $_GET['page'] ) && is_string( $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reason: We are not processing form information. $page = sanitize_text_field( wp_unslash( $_GET['page'] ) ); $this->show_page( $page ); } } /** * Shows an admin settings page. * * @param string $page Page to display. * * @return void */ protected function show_page( $page ) { switch ( $page ) { case 'wpseo_tools': require_once WPSEO_PATH . 'admin/pages/tools.php'; break; case 'wpseo_files': require_once WPSEO_PATH . 'admin/views/tool-file-editor.php'; break; default: break; } } } PKE\y class-network-admin-menu.phpnuW+Acheck_manage_capability() ) { return; } add_menu_page( __( 'Network Settings', 'wordpress-seo' ) . ' - Yoast SEO', 'Yoast SEO', $this->get_manage_capability(), $this->get_page_identifier(), [ $this, 'network_config_page' ], $this->get_icon_svg() ); $submenu_pages = $this->get_submenu_pages(); $this->register_submenu_pages( $submenu_pages ); } /** * Returns the list of registered submenu pages. * * @return array List of registered submenu pages. */ public function get_submenu_pages() { // Submenu pages. $submenu_pages = [ $this->get_submenu_page( __( 'General', 'wordpress-seo' ), $this->get_page_identifier(), [ $this, 'network_config_page' ] ), ]; if ( WPSEO_Utils::allow_system_file_edit() === true ) { $submenu_pages[] = $this->get_submenu_page( __( 'Edit Files', 'wordpress-seo' ), 'wpseo_files' ); } /** * Filter: 'wpseo_network_submenu_pages' - Collects all network submenus that need to be shown. * * @internal For internal Yoast SEO use only. * * @param array $submenu_pages List with all submenu pages. */ return (array) apply_filters( 'wpseo_network_submenu_pages', $submenu_pages ); } /** * Loads the form for the network configuration page. * * @return void */ public function network_config_page() { require_once WPSEO_PATH . 'admin/pages/network.php'; } /** * Checks whether the current user has capabilities to manage all options. * * @return bool True if capabilities are sufficient, false otherwise. */ protected function check_manage_capability() { return current_user_can( $this->get_manage_capability() ); } /** * Returns the capability that is required to manage all options. * * @return string Capability to check against. */ protected function get_manage_capability() { return 'wpseo_manage_network_options'; } } PKE\ t&class-submenu-capability-normalize.phpnuW+APKE\.Nclass-replacevar-editor.phpnuW+APKE\0[class-admin-menu.phpnuW+APKE\ 0ww+class-replacevar-field.phpnuW+APKE\+!!\4class-base-menu.phpnuW+APKE\<Vclass-menu.phpnuW+APKE\y ^class-network-admin-menu.phpnuW+APKlh